import 'dart:convert';

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';

import 'package:merchants/models/session.dart';

/// 会话状态管理：
/// 1. 启动时从 SharedPreferences 恢复 Session
/// 2. 登录成功后 save() 持久化
/// 3. 退出登录 clear() 清空
class SessionNotifier extends AsyncNotifier<Session?> {
  SharedPreferences? _prefs; // 本地存储实例，可为空

  // ---------- 私有工具：保证 _prefs 已初始化 ----------
  Future<void> _ensurePrefs() async {
    _prefs ??= await SharedPreferences.getInstance();
  }

  // ---------- Provider 首次构建 ----------
  @override
  Future<Session?> build() async {
    await _ensurePrefs();
    final raw = _prefs!.getString('session'); // 这里已确保 _prefs 非空
    return Session.fromMap(
      raw == null ? null : jsonDecode(raw) as Map<String, dynamic>?,
    );
  }

  // ---------- 登陆成功后保存 ----------
  Future<void> save(Session session) async {
    await _ensurePrefs(); // 若首帧尚未完成，先初始化
    state = AsyncData(session);
    await _prefs!.setString('session', jsonEncode(session.toMap()));
  }

  // ---------- 退出登录或 token 失效 ----------
  Future<void> clear() async {
    await _ensurePrefs();
    state = const AsyncData(null);
    await _prefs!.remove('session');
  }
}

/// 对外暴露的 Provider
final sessionProvider = AsyncNotifierProvider<SessionNotifier, Session?>(
  SessionNotifier.new,
);
